package icasue.stronger.config;

import icasue.stronger.wareable.logicstronger.StrongerAdvice;
import icasue.stronger.wareable.logicstronger.logicsupport.DefaultStrongerLogic;
import icasue.stronger.wareable.nameconvert.DefaultBeanNameTransFor;
import lombok.Data;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Author: Qiao Hang
 * @CreateDate: 2020/7/10 下午5:40
 * @UpdateDate:
 * @Description:
 */
@Data
public class EnvironmentStrongerScanConfig {

    //启用StrongerAdvice.
    public Boolean enable = Boolean.FALSE;

    //目标扫描包分组
    public List<EnvironmentStrongerGroup> groups = new ArrayList<>();

    @Data
    public static class EnvironmentStrongerGroup{
        //扫描的包结构
        public List<String> basePackages = Arrays.asList();

        //调度增强Bean
        //当执行方法调度的后置处理不需要引用其他容器中的组件时选用Prototype-bean的方式，
        //每个代理都持有不同的方法调度处理增强，优先级次，性能高
        //可以把信息扔到队列里，线程处理持久化，推荐使用这种方式
        public Class<? extends StrongerAdvice> strongerAdvice = DefaultStrongerLogic.class;

        //调度增强引用
        //当在执行方法调度的后置处理时需要使用到其他容器中的组件时选用引用的方式，优先级较高.
        public String strongerAdviceRef = "";

        //过滤标记的注解(include those classes which include in basePackages and marked @MarkedProxy)
        public Class<? extends Annotation> markedAnnotation = Annotation.class;

        //扫描不包含的类(配合包扫描使用)
        public List<String> excludeRegex = new ArrayList<>();

        //当扫描代理bean与spring的beanDefinition冲突时，保存spring BeanDefinition的名字.
        public Class<? extends DefaultBeanNameTransFor> beanNameStoreTransForLogic = DefaultBeanNameTransFor.class;
    }
}
